//
// Created by 2592345590 on 2022/5/7.
//

#ifndef WORKPLACE_GROUP_H
#define WORKPLACE_GROUP_H
#include <iostream>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <stack>
using namespace std;

struct Edge{
    int v1,v2,value;
    Edge(int v1,int v2,int value) : v1(v1), v2(v2), value(value){};
};

class Group {
public:
    vector<bool> vex;//顶点访问表 有没有都行
    vector<vector<int> > edge;//邻接矩阵
    vector<Edge> edges;//边节点
    int choice;//无向图0 有向图1
public:
    Group(int v,int e,int choice,bool random);//构造函数 choice无向图有向图 random是否随机
    void PrintGroup() const;//打印当前图
    void Prim();//最小生成树算法 普里姆算法
    void Kruskal();//最小生成树算法 克鲁斯卡尔算法
    void Dijkstra(int v);//最短路径 求某一顶点到其它顶点的最短路径 迪杰斯特拉算法
    void Floyd();//最短路径 求任意两个顶点的最短路径 弗洛伊德算法
    vector<int> TopologicalSort();//拓扑排序 可以用于判断顺序 和 有向图是否有环
    vector<int> DisobeyTopologicalSort();//逆拓扑排序
    void CriticalPath();//关键路径 求事件最早最迟发生时间 活动最早最迟发生时间
};

#endif //WORKPLACE_GROUP_H
